textview: Avoid relocating adjustments on ::size-allocate while these are animating
authorCarlos Garnacho <carlosg@gnome.org>
Mon, 21 Jul 2014 19:16:32 +0000 (21:16 +0200)
committerMatthias Clasen <mclasen@redhat.com>
Sun, 3 Aug 2014 18:12:47 +0000 (20:12 +0200)
An animation may be scheduled while the textview content changed in size, so the resize
queued would just unset the animation and set the adjusments with a current value,
defeating gtk_text_view_scroll_to_iter(). In this case, just avoid the adjustment change,
as there is a target value on the way.

https://bugzilla.gnome.org/show_bug.cgi?id=733406

gtk/gtkadjustment.c
gtk/gtkadjustmentprivate.h
gtk/gtktextview.c

index 74541a8843963eb02dd6b890f4eccf9e6b5933f7..88a02a5a66e7758d9d1d9f6f117c8c86c6f82e76 100644 (file)
@@ -1017,3 +1017,9 @@ gtk_adjustment_get_animation_duration (GtkAdjustment *adjustment)
 {
   return adjustment->priv->duration;
 }
+
+gboolean
+gtk_adjustment_is_animating (GtkAdjustment *adjustment)
+{
+  return adjustment->priv->tick_id != 0;
+}
index 3d9ba4c76cdb00a17c92ee43a976cb977ed6a68d..c0884448a7d666caced1f355e41eb3e0c53d0fe8 100644 (file)
@@ -32,6 +32,8 @@ void gtk_adjustment_animate_to_value (GtkAdjustment *adjustment,
                                       gdouble        value);
 gdouble gtk_adjustment_get_target_value (GtkAdjustment *adjustment);
 
+gboolean gtk_adjustment_is_animating (GtkAdjustment *adjustment);
+
 G_END_DECLS
 
 
index 1a01582a718c7e1b7800d46f1c4277ba5c471052..4283f24a777901a867acd86b0f99a01036968785 100644 (file)
@@ -3887,8 +3887,10 @@ gtk_text_view_size_allocate (GtkWidget *widget,
   gtk_text_view_allocate_children (text_view);
 
   /* Update adjustments */
-  gtk_text_view_set_hadjustment_values (text_view);
-  gtk_text_view_set_vadjustment_values (text_view);
+  if (!gtk_adjustment_is_animating (priv->hadjustment))
+    gtk_text_view_set_hadjustment_values (text_view);
+  if (!gtk_adjustment_is_animating (priv->vadjustment))
+    gtk_text_view_set_vadjustment_values (text_view);
 
   /* The GTK resize loop processes all the pending exposes right
    * after doing the resize stuff, so the idle sizer won't have a